package 算法.其他算法;

public class JZ58左旋转字符串 {

    //三次反转
    public String LeftRotateString2(String str,int n) {
        if(str.isEmpty() || str.length() == 0)
            return "";
        int m = str.length();
        //取余，因为每次长度为n的旋转数组相当于没有变化
        n = n % m;
        char[] s = str.toCharArray();
        //[a b c W X Y Z]

        //第一次逆转全部元素  [Z Y X W c b a]
        reverse(s, 0, m - 1);
        //第二次只逆转开头m-n个 [W X Y Z c b a]
        reverse(s, 0, m - n - 1);
        //第三次只逆转结尾n个  [W X Y Z a b c]
        reverse(s, m - n, m - 1);
        return new String(s);
    }
    //交换函数
    private void swap(char[] s, int a, int b){
        char temp = s[a];
        s[a] = s[b];
        s[b] = temp;
    }
    //反转函数
    private void reverse(char[] s, int start, int end){
        while(start < end){
            swap(s, start++, end--);
        }
    }

    //遍历拼接
    public String LeftRotateString3(String str,int n) {
        if(str.isEmpty() || str.length() == 0)
            return "";
        int m = str.length();
        //取余，因为每次长度为m的旋转数组相当于没有变化
        n = n % m;
        StringBuilder res = new StringBuilder();
        //先遍历后面的，放到前面
        for(int i = n; i < m; i++)
            res.append(str.charAt(i));
        //再遍历前面的放到后面
        for(int i = 0; i < n; i++)
            res.append(str.charAt(i));
        return res.toString();
    }


    public String LeftRotateString(String str,int n) {
        if(str.length()==0 || n==0)
            return str;
        int cnt = str.length();
        int i = 1;
        while (n-->0){
            i++;
            if(i==str.length()+1)
                i=1;
        }
        StringBuilder sb = new StringBuilder();
        while (cnt-->0){
            sb.append(str.charAt(i-1));
            i++;
            if(i==str.length()+1)
                i=1;
        }
        return sb.toString();
    }
}
